/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package main;

import java.io.File;
import java.io.PrintStream;
import java.util.Map;

import clasificador.ValidadorCruzado;
import clasificador.genetico.reglas.EvolveReglas2;
import datos.MuestraClasificada;

/**
 *
 * @author e235166
 */
public class MainEvolveReglas2 extends Main {
        
    protected static Parameter[] getParameters()
    {
        Parameter[] pars = new Parameter[8];
        Parameter probCruce = new Parameter()
                                .name("probCruce")
                                .flag("-probCruce")
                                .defaultsTo("0.05");
        pars[0] = probCruce;
        Parameter decayCruce = new Parameter()
                                .name("decayCruce")
                                .flag("-decayCruce")
                                .defaultsTo("0.9");
        pars[1] = decayCruce;
        Parameter propElitista = new Parameter()
                                .name("propElitista")
                                .flag("-propElitista")
                                .defaultsTo("0.05");
        pars[2] = propElitista;
        Parameter propTest = new Parameter()
                                .name("propTest")
                                .flag("-propTest")
                                .defaultsTo("0.3");
        pars[3] = propTest;
        Parameter probMutacion = new Parameter()
                                .name("probMutacion")
                                .flag("-probMutacion")
                                .defaultsTo("0.07");
        pars[4] = probMutacion;
        Parameter tamanoPoblacion = new Parameter()
                                .name("tamanoPoblacion")
                                .flag("-tamanoPoblacion")
                                .defaultsTo("100");
        pars[5] = tamanoPoblacion;
        Parameter nReglasMedio = new Parameter()
                                .name("nReglasMedio")
                                .flag("-nReglasMedio")
                                .defaultsTo("4");
        pars[6] = nReglasMedio;
        Parameter nEpocas = new Parameter()
                                .name("nEpocas")
                                .flag("-nEpocas")
                                .defaultsTo("1000");
        pars[7] = nEpocas;
        return pars;
    }
    public static void main(String[] args)
    {
        Map<String,Object> pars = readParameters(args);
        
        String filename = null;
        String outputFile = null;
        
        try {
            filename = parseFilename(args);
            outputFile = parseParameter(args, "-log");            
        } catch (NumberFormatException ex) {
            System.out.println("Parametro numerico invalido");
            printUsage(getParameters());
            exit(1);
        }
        if (filename == null) {
            System.out.println("Debe especificar un nombre de fichero");
            printUsage(getParameters());
            exit(1);
        }
        if (outputFile != null) {
            System.out.println("Redirigiendo salida a " + outputFile);
            try {
                out = new PrintStream(new File(outputFile));                
            } catch (Exception ex) {
                System.out.println("No se ha podido abrir el fichero " + outputFile);
                ex.printStackTrace(System.out);
            }
        }
        
        try
        {
            MuestraClasificada muestra = parseSample(filename);

            Class<EvolveReglas2> clasificador =
                    (EvolveReglas2.class);
            ValidadorCruzado v = new ValidadorCruzado(clasificador, 10, 1);
            ValidadorCruzado.ResultadosValidacionCruzada resultados = v.validar(muestra,pars);
            printResults(filename, resultados);
            
        } catch (Exception ex) {
            out.println( "Error al ejecutar la validacion!" );
            ex.printStackTrace(out);
        }
    }
}
